
package DAO;

import java.util.ArrayList;
import models.Profesor;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;


public class ProfesorDao {

    private EntityManager em;

    /**
     *
     * @param nombre
     * @param apellido
     * @param documento
     * @param especialidad
     * @param telFijo
     * @param telMovil
     * @param Direccion
     * @param nacimiento
     * @param Genero
     * @param edad
     * @param usuario
     * @return
     */
    public Profesor crearProfesor(String nombre, String apellido,
            Long documento, String especialidad, String telFijo,
            String telMovil, String Direccion, String nacimiento,
            String Genero, int edad, String usuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Profesor p = new Profesor();
//        p.setNombreProfesor(nombre);
//        p.setApellidoProfesor(apellido);
//        p.setDocProfesor(documento);
//        p.setEspecialidad(especialidad);
//        p.setTelFijo(telFijo);
//        p.setTelMovil(telMovil);
//        p.setFechaNacimientoProf(nacimiento);
//        p.setDireccionProf(Direccion);
//        p.setGeneroProf(Genero);
//        p.setEdadProf(edad);
//        p.setNombreUsuario(usuario);
        em.getTransaction().begin();
        em.persist(p);//con esta funcion lo guarda en la base de datos
        em.getTransaction().commit();
        em.close();
        emf.close();
        return p;
    }

    public Profesor encontrarProfesor(Long docProfesor) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Profesor u = em.find(Profesor.class, docProfesor);// con esta funcion se busca un dato por primary key, el primer parametro es nuestra clase entidad
        em.close();
        emf.close();
        return u;
    }

    public Collection<Profesor> encontrarProfesoresSinUsuario() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT p FROM Profesor p WHERE p.nombreUsuario IS NULL");
        Collection<Profesor> p = query.getResultList();
        em.close();
        emf.close();
        return p;
    }
    public Collection<Profesor> encontrarProfesoresConUsuario() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT p FROM Profesor p WHERE p.nombreUsuario IS NOT NULL");
        Collection<Profesor> p = query.getResultList();
        em.close();
        emf.close();
        return p;
    }
    /*  public void borrarProfesor(String nombreProfesor) {
    //Profesor u = encontrarProfesor(nombreProfesor);//en este caso podemos borrar un Profesor por nombre
    if (u != null) {//si no lo encuentra por supuesto no lo intenta borrar
    em.remove(u);// borra de la tabla ese registro
    }
    }*/

    public Profesor actualizarProfesor(Long docActual, String nombre, String apellido,
            Long documento, String especialidad, String telFijo,
            String telMovil, String Direccion, String nacimiento,
            String Genero, int edad, String usuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Profesor p = em.find(Profesor.class, docActual); //se usa el entity manager para encontrarlo luego cuando se llame ActualizarProfesor se hace commit y va a persistir el Profesor actualizado
        if (p != null) {
//            p.setNombreProfesor(nombre);
//            p.setApellidoProfesor(apellido);
//            //p.setDocProfesor(documento); //no se le puede cambiar el doc
//            p.setEspecialidad(especialidad);
//            p.setTelFijo(telFijo);
//            p.setTelMovil(telMovil);
//            p.setFechaNacimientoProf(nacimiento);
//            p.setDireccionProf(Direccion);
//            p.setGeneroProf(Genero);
//            p.setEdadProf(edad);
        }
        em.getTransaction().commit();
        em.close();
        emf.close();
        return p;
    }

    public Collection<Profesor> encontrarProfesores() { //encontrar todos los Profesors
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        Query query = em.createQuery("SELECT u FROM Profesor u");// Ojo la sentencia estÃ¡ en Java Query Language, no SQL
        Collection<Profesor> p = query.getResultList(); // me guarda la lista de todos los usuarios en mi coleccion
        em.close();
        emf.close();
        return p;
    }

    public Collection<Profesor> encontrarProfesoresNoDirectores() { //encontrar todos los Profesors
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Query query = em.createQuery("SELECT p FROM Profesor p LEFT OUTER JOIN p.curso c WHERE c.idProfesor IS NULL");
        Collection<Profesor> c = query.getResultList();
        em.getTransaction().commit();
        em.close();
        emf.close();
        return c;
    }

    public void asignarUsuarioAProfesor(Long docProf, String nombreUsuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("sischoolPU");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Profesor e = em.find(Profesor.class, docProf);
//        e.setNombreUsuario(nombreUsuario);
        em.getTransaction().commit();
        em.close();
        emf.close();
    }


    /**
     * Metodo que Busca todos los administradores del sistema.
     * Retorna una lista con todos los usuarios que tienen ese rol en el
     * sistema
     * @return List
     */
    public List <Profesor> buscarAdmins() {
        List admins = new ArrayList();
        try {

            Query q1 = em.createNamedQuery("Usuario.findByAdmins");
            admins =  q1.getResultList();
            if (admins == null) {
                return admins = null;
            }
        } catch (Exception e) {
            System.out.println("Error al buscar Administrador" + e.getMessage());
        } finally {
            em.close();
            closeEmf();
        }
        return admins;
    }



    private void closeEmf(){


    }


    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }
}
